package com.example.hyg_veintype.utils.chartUtil;

import android.content.Context;
import android.graphics.Color;
import android.graphics.DashPathEffect;


import com.example.hyg_veintype.R;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;

import java.util.LinkedList;

/**
 * @author: yyw
 * time: 2020/12/7 16:31
 * desc:蓝牙接收数据实时点绘制工具类
 */
public class RealTimeChartUtils {
    static LinkedList<Integer> dataList;
    static LineChart chart;

    //Y轴最大值
    public static final int YMAX = 300;
    //Y轴最小值
    public static final int YMIN = 0;
    //一页数据最多展示的点数量
//    public static final int POINT_MAX=1478;
    public static final int POINT_MAX = 739;

    /**
     * chart配置
     *
     * @param chart
     * @param context
     */
    public static void setChart(LineChart chart, Context context, LinkedList<Integer> dataList) {

        RealTimeChartUtils.dataList = dataList;
        RealTimeChartUtils.chart = chart;
        //设置图表
        {
            // 背景颜色
            chart.setBackgroundColor(Color.WHITE);
            //禁用描述文字
            chart.getDescription().setEnabled(false);
            // 启用触摸手势
            chart.setTouchEnabled(true);
            // set listeners
//            chart.setOnChartValueSelectedListener(this);
            //绘制网格背景
            chart.setDrawGridBackground(false);
            // 覆盖物定义
            MyMarkerView mv = new MyMarkerView(context, R.layout.veintype_custom_marker_view);
            // 覆盖物设置到图标
//            mv.setChartView(chart);
//            chart.setMarker(mv);
            // 启用缩放和拖动
            chart.setDragEnabled(true);
            chart.setScaleEnabled(false);
            // chart.setScaleXEnabled(true);
            // chart.setScaleYEnabled(true);
            // 沿两个轴强制收缩缩放
            chart.setPinchZoom(false);
            //禁用图例
            chart.getLegend().setEnabled(false);
        }
        XAxis xAxis;
        {   // // X轴样式 // //
            xAxis = chart.getXAxis();
            //是否绘制坐标轴(false网格线为true也不会生效)及网格线
            xAxis.setEnabled(true);
            xAxis.setDrawGridLines(false);
            //是否绘制标签
            xAxis.setDrawLabels(false);
            //标签数量（纵向网格线数量）(最多25，如果要设置更多的话去修改源码里面的值)
            xAxis.setLabelCount(0, false);
            //网格线颜色
            xAxis.setGridColor(Color.GRAY);
            //X轴位置及颜色、宽度
            xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
            xAxis.setAxisLineColor(Color.BLACK);
            xAxis.setAxisLineWidth(1f);
            // 网格线虚线
//            xAxis.enableGridDashedLine(10f, 10f, 0f);
            // X轴范围控制
//            xAxis.setAxisMinimum(0f);
//            xAxis.setAxisMaximum(10f);
//            xAxis.setAvoidFirstLastClipping(true);
        }
        YAxis yAxis;
        {   // // Y轴样式 // //
            yAxis = chart.getAxisRight();
            //是否绘制坐标轴(false网格线为true也不会生效)及网格线
            yAxis.setEnabled(true);
            xAxis.setDrawGridLines(false);
            // 禁用双轴（仅使用右轴）
            chart.getAxisLeft().setEnabled(false);
            chart.getAxisLeft().setDrawGridLines(false);
            //Y轴颜色、宽度
            yAxis.setAxisLineColor(Color.BLACK);
            yAxis.setAxisLineWidth(1f);
            //Y轴网格线设置
            yAxis.setGridColor(Color.GRAY);
            //是否绘制标签
            yAxis.setDrawLabels(false);
            //标签数量（纵向网格线数量）(最多25，如果要设置更多的话去修改源码里面的值)
            yAxis.setLabelCount(0, false);
            // 设置网格Y轴为虚线
//            yAxis.enableGridDashedLine(10f, 10f, 0f);
            //true 则轴间隔不允许低于特定粒度
            yAxis.setGranularityEnabled(true);
            // Y轴范围控制
            chart.getAxisLeft().setAxisMinimum(YMIN);
            chart.getAxisLeft().setAxisMaximum(YMAX);

            yAxis.setAxisMinimum(YMIN);
            yAxis.setAxisMaximum(YMAX);
        }
        //均值线设置
//        {
//            LimitLine ll2 = new LimitLine(120, "120均值");
//            ll2.setLabel("均值");
//            ll2.setTextColor(Color.parseColor("#5dbcfe"));
//            ll2.setLineWidth(1f);
//            ll2.setEnabled(true);
//            ll2.setLineColor(Color.parseColor("#5dbcfe"));
//            ll2.setLabelPosition(LimitLine.LimitLabelPosition.RIGHT_BOTTOM);//标签位置
//            ll2.setTextSize(10f);
//            chart.getAxisRight().addLimitLine(ll2);
//        }
        // 添加空数据
        LineData data = new LineData();
        chart.setData(data);
        //第二种方式刷新
        initLineData();
        //隐藏左边坐标轴横网格线
        chart.getAxisLeft().setDrawGridLines(false);
        //隐藏右边坐标轴横网格线
        chart.getAxisRight().setDrawGridLines(false);
    }

    /**
     * 折线样式设置
     *
     * @param set
     * @return
     */
    public static synchronized LineDataSet setSetStyle(LineDataSet set) {
        //折线图是否绘制点、大小、颜色、是否实心圆
        set.setDrawCircles(false);
        set.setCircleRadius(1f);
        set.setCircleColor(Color.RED);
        set.setDrawCircleHole(true);
        //绘制点上方的覆盖物
        set.setDrawIcons(false);
        //在点上方绘制值
        set.setDrawValues(false);
        //折线样式(LINEAR,STEPPED,CUBIC_BEZIER,HORIZONTAL_BEZIER)
        set.setMode(LineDataSet.Mode.HORIZONTAL_BEZIER);
        //绘制虚线
//            set1.enableDashedLine(10f, 5f, 0f);
        // 点击后的选择线为虚线（不设置则为实线）
//        set1.enableDashedHighlightLine(10f, 5f, 0f);
        // 折线颜色
        set.setColor(Color.BLUE);
        // 线的粗细
        set.setLineWidth(1f);
        // 自定义图例条目
        set.setFormLineWidth(1f);
        set.setFormLineDashEffect(new DashPathEffect(new float[]{10f, 5f}, 0f));
        set.setFormSize(15.f);
        // 文字大小
        set.setValueTextSize(9f);
        // 设置启用填充区域
        set.setDrawFilled(false);
//        set.setFillFormatter(new IFillFormatter() {
//            @Override
//            public float getFillLinePosition(ILineDataSet dataSet, LineDataProvider dataProvider) {
//                return chart.getAxisLeft().getAxisMinimum();
//            }
//        });

        // 设置填充区域的颜色
//        if (Utils.getSDKInt() >= 18) {
//            // drawables only supported on api level 18 and above
//            Drawable drawable = ContextCompat.getDrawable(this, R.drawable.fade_red);
//            set.setFillDrawable(drawable);
//        } else {
//            set.setFillColor(Color.BLACK);
//        }
        return set;
    }

    /**
     * 添加新的点（超过显示的点数量后滚动）
     *
     * @param yValure y轴数据
     */
    public static void addEntry(int xValure, float yValure) {
        LineData data = chart.getData();

        if (data != null) {
            ILineDataSet set = data.getDataSetByIndex(0);
            if (set == null) {
                LineDataSet lineDataSet = new LineDataSet(null, "");
                set = setSetStyle(lineDataSet);
                data.addDataSet(set);
            }
            //添加数据点并刷新数据集
//            data.addEntry(new Entry(set.getEntryCount() + 1, yValure), 0);
            data.addEntry(new Entry(xValure, yValure), 0);
            data.notifyDataChanged();
            // 图标刷新
            chart.notifyDataSetChanged();
            // 限制可见条目的数量
            chart.setVisibleXRangeMaximum(POINT_MAX);
//             chart.setVisibleYRange(30, AxisDependency.LEFT);
            // 移至最新条目
            chart.moveViewToX(set.getEntryCount());
//            chart.moveViewToX(data.getEntryCount());
            // this automatically refreshes the chart (calls invalidate())
//             chart.moveViewTo(data.getXValCount()-7, 55f,
//             AxisDependency.LEFT);
        }
    }

    /**
     * 初始化图表数据（1条y值为50的直线）
     */
    private static void initLineData() {
        LineData data = RealTimeChartUtils.chart.getData();
        ILineDataSet set = data.getDataSetByIndex(0);
        if (set == null) {
            LineDataSet lineDataSet = new LineDataSet(null, "");
            set = setSetStyle(lineDataSet);
            data.addDataSet(set);
            for (int i = 0; i < dataList.size(); i++) {
                data.addEntry(new Entry(i, dataList.get(i)), 0);
            }
        }
        data.notifyDataChanged();
        chart.notifyDataSetChanged();
        chart.invalidate();
        chart.setVisibleXRangeMaximum(POINT_MAX);
    }
}
